home *** CD-ROM | disk | FTP | other *** search
-
- 100 '---------------------------------------
- 101 '
- 102 ' KAREX1.BAS is a Microsoft BASIC
- Release 5 program
- 103 ' that solves EXAMPLE 1 of the article
- 104 '
- 105 ' KARMARKAR'S ALGORITHM
- 106 '
- 107 ' by Andrew M. Rockett
- and John C. Stevenson
- 108 '
- 109 'This program was written
- by Andrew M. Rockett
- 110 '
- 111 '---------------------------------------
- 200 '
- 202 ' N is number of unknowns and K is the
- number of equations
- 204 '
- 206 N = 3 : K = 1
- 208 '
- 210 K1 = K + 1 : K2 = 2*K1
- 212 DIM A0(N), XOLD(N), XNEW(N), CC(N),
- CP(N),
- A(K,N), B(K1,N), B1(K1,K2),
- B2(N,K1), B3(N,N)
- 214 '
- 216 ' CC is for the objective function
- 218 ' B1, B2 and B3 are used for the
- computation of CP
- 220 ' R and C are "row" and "column" indices
- 222 '
- 224 ' Initially, set XNew = A0, the center
- of simplex
- 226 '
- 228 FOR C = 1 TO N: A0(C) = 1/N : XNEW(C) =
- A0(C)
- :NEXT C
- 230 '
- 232 ' T is the tolerance
- 234 '
- 236 T = .001
- 238 '
- 240 ' ALPHA is usually set equal to 1/4 ...
- 242 '
- 244 ALPHA = .25
- 246 '
- 248 ITERATION = 0
- 250 '
- 252 ' Data for constraint matrix A
- 254 '
- 256 DATA 2, -3, 1
- 258 '
- 260 FOR R = 1 TO K:FOR C = 1 TO N:READ
- A(R,C):NEXT
- C:NEXT R
- 262 '
- 264 ' Data for objective function CC
- 266 '
- 268 DATA 3, 3, -1
- 270 '
- 272 FOR C = 1 TO N : READ CC(C) : NEXT C
- 274 '
- 276 ' Set initial Value to value at center
- of simplex ...
- 278 '
- 280 V = 0 : FOR C=1 TO N:V = V + CC(C)*A0(C):NEXT
- C: VNEW = V
- 282 '
- 284 ' Now we can begin the MAIN ITERATION
- process ...
- 286 '
- 300 WHILE VNEW/V > T
- 301 '
- 302 PRINT USING "####";ITERATION;:
- FOR C=1 TO N:PRINT USING
- "###.####";XNEW(C); :
- NEXT C :
- PRINT USING
- "####.#######";VNEW/V
- 303 '
- 304 ITERATION = ITERATION + 1
- 305 '
- 306 ' Put Xnew into Xold
- 307 '
- 308 FOR C = 1 TO N : XOLD(C) = XNEW(C) : NEXT C
- 309 '
- 310 ' Construct the matrix B
- 311 '
- 312 FOR R=1 TO K:FOR C=1 TO
- N:B(R,C)=A(R,C)*XOLD(C):
- NEXT C:NEXT R
- 313 FOR C = 1 TO N : B(K1,C) = 1 : NEXT C
- 314 '
- 315 ' Zero matrices to be used in
- computations...
- 316 '
- 317 FOR R=1 TO K1 : FOR C=1 TO K2 :
- B1(R,C)=0 :
- NEXT C : NEXT R
- 318 FOR R=1 TO N : FOR C=1 TO K1 :
- B2(R,C)=0 :
- NEXT C : NEXT R
- 319 FOR R=1 TO N : FOR C=1 TO N :
- B3(R,C)=0 :
- NEXT C : NEXT R
- 320 FOR C=1 TO N : CP(C) = 0 : NEXT C
- 321 '
- 322 ' Find BBT and put in B1
- 323 '
- 324 FOR R = 1 TO K1 :
- FOR C = 1 TO K1 :
- FOR I = 1 TO N:B1(R,C)=B1(R,C)+B(R,I)*B(C,I):
- NEXT I:
- NEXT C :
- NEXT R
- 325 '
- 326 ' Adjoin an identity matrix to BBT
- 327 '
- 328 FOR I = 1 TO K1 : B1(I,I+K1)=1 : NEXT I
- 329 '
- 330 ' Row reduce BBT|I
- 331 '
- 332 FOR R = 1 TO K1
- 333 IF B1(R,R) <> 0 THEN 338
- 334 I = R + 1
- 335 IF I > K1 THEN PRINT"Error! BBT is
- SINGULAR!": GOTO 400
- 336 IF B1(I,R) = 0 THEN I = I+1 : GOTO
- 335
- 337 FOR C = 1 TO K2 : SWAP
- B1(R,C),B1(I,C) :
- NEXT C
- 338 FOR I = R+1 TO K1 :
- Z = B1(I,R)/B1(R,R):
- FOR C=1 TO K2:B1(I,C)=B1(I,C)
- -Z*B1(R,C):
- NEXT C:
- NEXT I
- 339 NEXT R
- 340 '
- 341 ' Now back substitute to finish it ...
- 342 '
- 343 FOR R = K1 TO 2 STEP -1 :
- FOR I = R-1 TO 1 STEP -1 :
- Z = B1(I,R)/B1(R,R) :
- FOR C = R TO K2:B1(I,C)=B1(I,C)-Z*B1(R,C):
- NEXT C:
- NEXT I :
- NEXT R
- 344 '
- 345 Remember to make diagonal entries 1's
- 346 '
- 347 FOR R=1 TO K1 :
- Z = B1(R,R) :
- FOR C = 1 TO K2 : B1(R,C) = B1(R,C)/Z :
- NEXT C :
- NEXT R
- 348 '
- 349 ' BBT Inverse is now in B1 in columns
- K1+1 to K2
- 350 '
- 351 ' Now multiply BBT Inverse by BT and put
- in B2
- 352 '
- 353 FOR R = 1 TO N :
- FOR C = 1 TO K1 :
- FOR J = 1 TO K1:B2(R,C)=
- B2(R,C)+B(J,R)*B1
- (J,C+K1):
- NEXT J:
- NEXT C :
- NEXT R
- 354 '
- 355 ' Take THAT and multiply by B and put in
- B3
- 356 '
- 357 FOR R = 1 TO N :
- FOR C = 1 TO N :
- FOR J = 1 TO
- K1:B3(R,C)=B3(R,C)+B2(R,J)*B(J,C):
- NEXT J:
- NEXT C :
- NEXT R
- 358 '
- 359 ' Find I-B3 by subtracting 1's on
- diagonal and changing signs
- 361 '
- 362 FOR R = 1 TO N : B3(R,R) = B3(R,R) - 1 :
- NEXT R
- 363 FOR R=1 TO N:FOR C=1 TO N:B3(R,C) =
- -1*B3(R,C):
- NEXT C:NEXT R
- 364 '
- 365 ' Multiply by D
- 366 '
- 367 FOR R=1 TO N:FOR C=1 TO
- N:B3(R,C)=B3(R,C)*
- XOLD(C):NEXT C:NEXT R
- 368 '
- 369 ' Find projection of CC and call it CP
- 370 '
- 371 FOR R=1 TO N:FOR C=1 TO
- N:CP(R)=CP(R)+B3(R,C)*
- CC(C):NEXT C:NEXT R
- 372 '
- 373 ' Find length of CP and the normalized
- CP
- 374 '
- 375 AA = 0
- 376 FOR C=1 TO N : AA = AA + CP(C)*CP(C) :
- NEXT C
- 377 AA = SQR(AA) : FOR C=1 TO N : CP(C) =
- CP(C)/AA : NEXT C
- 378 '
- 379 'Find a*, project back to get new X ...
- 380 '
- 381 AA = SQR(N*(N-1))/ALPHA
- 382 FOR C=1 TO N : XNEW(C) = (A0(C) -
- CP(C)/AA)*XOLD(C) :
- NEXT C
- 383 '
- 384 ' And remember to divide by "size" of
- new X to complete the 385 ' projective
- transformation back to the original simplex
- 386 '
- 387 AA = 0
- 388 FOR C=1 TO N : AA = AA + XNEW(C) : NEXT
- C
- 389 FOR C=1 TO N : XNEW(C) = XNEW(C)/AA :
- NEXT C
- 390 '
- 391 ' Find objective function Value at NEW
- point X
- 392 '
- 393 VNEW = 0
- 394 FOR C=1 TO N : VNEW = VNEW + CC(C)*XNEW(C) : NEXT C
- 395 '
- 396 WEND ' End of main iteration loop ...
- 397 '
- 398 PRINT:PRINT"Tolerance reached:
- Vnew/Vinitial = "; VNEW/V:PRINT
- 399 PRINT USING "####"; ITERATION; :
- FOR C=1 TO N:PRINT USING
- "###.####";XNEW(C); :
- NEXT C :
- PRINT USING
- "####.#######";VNEW/V
- 400 END